<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>nodejs1 | Hexo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="同步和异步的对比【非阻塞I/O和阻塞I/O】异步读取文件异步嵌套读取文件同步读取文件异步和同步操作中，捕获错误的方式Node 中的模块化 什么是程序开发中的模块及好处 什么是程序开发中的模块化：把一些功能类似的代码，封装到一个单独的文件中去，这些单独抽离出来的代码文件，就能够提供各种各样好用的功能；这种通过代码功能分割文件的方式，叫做程序中的模块化； 好处：保证了每个文件的功能（职能）单一；需要什">
<meta property="og:type" content="article">
<meta property="og:title" content="nodejs1">
<meta property="og:url" content="http://yoursite.com/2017/10/25/node2/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="同步和异步的对比【非阻塞I/O和阻塞I/O】异步读取文件异步嵌套读取文件同步读取文件异步和同步操作中，捕获错误的方式Node 中的模块化 什么是程序开发中的模块及好处 什么是程序开发中的模块化：把一些功能类似的代码，封装到一个单独的文件中去，这些单独抽离出来的代码文件，就能够提供各种各样好用的功能；这种通过代码功能分割文件的方式，叫做程序中的模块化； 好处：保证了每个文件的功能（职能）单一；需要什">
<meta property="og:image" content="http://yoursite.com/2017/10/25/node2/images/模块化房屋.jpg">
<meta property="og:image" content="http://yoursite.com/2017/10/25/node2/images/笔记本主板.jpg">
<meta property="og:updated_time" content="2017-10-25T12:19:30.380Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="nodejs1">
<meta name="twitter:description" content="同步和异步的对比【非阻塞I/O和阻塞I/O】异步读取文件异步嵌套读取文件同步读取文件异步和同步操作中，捕获错误的方式Node 中的模块化 什么是程序开发中的模块及好处 什么是程序开发中的模块化：把一些功能类似的代码，封装到一个单独的文件中去，这些单独抽离出来的代码文件，就能够提供各种各样好用的功能；这种通过代码功能分割文件的方式，叫做程序中的模块化； 好处：保证了每个文件的功能（职能）单一；需要什">
<meta name="twitter:image" content="http://yoursite.com/2017/10/25/node2/images/模块化房屋.jpg">
  
    <link rel="alternate" href="/atom.xml" title="Hexo" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link rel="stylesheet" href="/css/style.css">
  

</head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">Hexo</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-node2" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2017/10/25/node2/" class="article-date">
  <time datetime="2017-10-25T12:18:59.640Z" itemprop="datePublished">2017-10-25</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      nodejs1
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="同步和异步的对比【非阻塞I-O和阻塞I-O】"><a href="#同步和异步的对比【非阻塞I-O和阻塞I-O】" class="headerlink" title="同步和异步的对比【非阻塞I/O和阻塞I/O】"></a>同步和异步的对比【非阻塞I/O和阻塞I/O】</h2><h3 id="异步读取文件"><a href="#异步读取文件" class="headerlink" title="异步读取文件"></a>异步读取文件</h3><h3 id="异步嵌套读取文件"><a href="#异步嵌套读取文件" class="headerlink" title="异步嵌套读取文件"></a>异步嵌套读取文件</h3><h3 id="同步读取文件"><a href="#同步读取文件" class="headerlink" title="同步读取文件"></a>同步读取文件</h3><h3 id="异步和同步操作中，捕获错误的方式"><a href="#异步和同步操作中，捕获错误的方式" class="headerlink" title="异步和同步操作中，捕获错误的方式"></a>异步和同步操作中，捕获错误的方式</h3><h2 id="Node-中的模块化"><a href="#Node-中的模块化" class="headerlink" title="Node 中的模块化"></a>Node 中的模块化</h2><p><img src="images/模块化房屋.jpg" alt="模块化房屋"><br><img src="images/笔记本主板.jpg" alt="笔记本主板"></p>
<h3 id="什么是程序开发中的模块及好处"><a href="#什么是程序开发中的模块及好处" class="headerlink" title="什么是程序开发中的模块及好处"></a>什么是程序开发中的模块及好处</h3><ul>
<li>什么是程序开发中的模块化：把一些功能类似的代码，封装到一个单独的文件中去，这些单独抽离出来的代码文件，就能够提供各种各样好用的功能；这种通过代码功能分割文件的方式，叫做程序中的模块化；</li>
<li>好处：保证了每个文件的功能（职能）单一；需要什么特定的功能，直接调用某一个特定的模块；对将来程序开发和维护都有好处！同时也解决了全局变量污染的问题，因为每个模块都有独立的作用域；</li>
</ul>
<h3 id="【★★】Node-中如何实现模块化"><a href="#【★★】Node-中如何实现模块化" class="headerlink" title="【★★】Node 中如何实现模块化"></a>【★★】Node 中如何实现模块化</h3><p>在Node中基于CommonJS规范，通过三个东西实现模块化：</p>
<ul>
<li>module：表示一个模块，在Node中，最常见的模块，就是一个个的JS文件！</li>
<li>require：作用是加载其他模块用的；在一个JS文件中，如何引用其他JS文件中的成员呢？就是用require</li>
<li>exports：在Node的模块中，如果这个模块需要向外暴露一些成员，供其他JS模块使用，那么，需要使用exports向外暴露这些成员！</li>
</ul>
<blockquote>
<p>注意：Node 中的模块化，主要解决的JS文件之间的相互依赖关系！</p>
</blockquote>
<h3 id="【理解】Node-中的模块的分类"><a href="#【理解】Node-中的模块的分类" class="headerlink" title="【理解】Node 中的模块的分类"></a>【理解】Node 中的模块的分类</h3><p>node由三部分组成：ECMAScript + 核心API + 第三方等API</p>
<h4 id="核心模块"><a href="#核心模块" class="headerlink" title="核心模块"></a>核心模块</h4><ul>
<li>什么是核心模块：官方，发现一些功能模块使用非常频繁，然后，官方把这些模块，编译成了二进制可执行文件，然后打包到了Node的安装包中；所以，这些核心模块就已经随着安装Node时候，被安装到了本地；</li>
<li>如何使用核心模块<br>　使用require（‘核心模块的名称’）；   require(‘fs/os/http’)</li>
</ul>
<h4 id="第三方模块"><a href="#第三方模块" class="headerlink" title="第三方模块"></a>第三方模块</h4><ul>
<li>什么是第三方模块：除了官方提供的好用的核心模块之外，我们程序员发现，还有一些使用也很频繁的代码和方法，一些牛逼的团体、个人、公司，开发出了好用的模块，通过NPM官网，托管出去，供其他人下载使用的这些模块；统称为第三方模块；</li>
<li>如何使用第三方模块<br>　－　通过moment这个第三方模块，来介绍如何使用一个第三方模块；</li>
<li>第三方模块的使用方式：<ol>
<li>先使用npm下载这个模块！【注意：在安装第三方模块的时候，安装的名字，就是你在require时候导入的名字】</li>
<li>使用require导入这个第三方模块！</li>
<li>通过官方文档，试着去使用这个第三方模块！</li>
<li>注意：无论是核心模块、还是第三方模块，都是通过 <code>标识符名称</code>来引用这个模块的！</li>
</ol>
</li>
</ul>
<h4 id="用户模块"><a href="#用户模块" class="headerlink" title="用户模块"></a>用户模块</h4><ul>
<li>什么是用户模块：程序员自己定义的JS文件，统称为用户模块！</li>
<li>用户模块向外导出成员的两种方式：<ul>
<li>第一种方式：使用global对象，相当于浏览器中的window对象<ul>
<li><ol>
<li>全局变量污染，</li>
</ol>
</li>
<li><ol>
<li>不知道成员是从哪个模块中暴露 出去的</li>
</ol>
</li>
</ul>
</li>
<li>推荐Node提供的exports</li>
</ul>
</li>
</ul>
<h3 id="exports-和-module-exports-的区别"><a href="#exports-和-module-exports-的区别" class="headerlink" title="exports 和 module.exports 的区别"></a>exports 和 module.exports 的区别</h3><ol>
<li><p>通过 module.exports 可以使用 . 的形式追加属性，也可以使用 等号 直接赋值的形式导出成员；</p>
</li>
<li><p>exports 只能通过 . 的形式追加属性；不能使用 等号 直接赋值的形式！</p>
</li>
<li><p>注意： 在一个 module 中，最终向外暴露的成员，以 module.exports 指向的对象为准！</p>
</li>
<li><p>在一个模块中，尽量不要混合使用 <code>module.exports</code> 和 <code>exports</code></p>
</li>
</ol>
<h3 id="【了解】模块加载规则"><a href="#【了解】模块加载规则" class="headerlink" title="【了解】模块加载规则"></a>【了解】模块加载规则</h3><ol>
<li>优先从缓存中加载<ul>
<li>使用 <code>delete require.cache[__filename]</code> 来防止模块被缓存，但是一般不建议这么用，因为模块的缓存能够提高运行效率；</li>
</ul>
</li>
<li>加载核心模块:优先从缓存中加载；如果缓存中没有的话，再去执行加载核心模块！</li>
<li><p>自己的模块:优先从缓存中加载；如果缓存中没有的话，再去执行加载用户模块！</p>
<ul>
<li>用户模块的查找规则：<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">用户模块的查找规则：</div><div class="line">如果不写后缀名，则先严格按照给定的文件名去查找模块并加载执行；</div><div class="line">index   -&gt;  index.js  -&gt;   index.json    -&gt;  index.node</div></pre></td></tr></table></figure>
</li>
</ul>
</li>
<li><p>第三方模块查找规则：</p>
<ol>
<li>node首先，查看项目根目录中有没有 <code>node_modules</code> 文件夹</li>
<li>查找 <code>node_modules</code> 文件夹中，有没有和第三方模块名称一致的文件夹</li>
<li>在模块对应的文件夹中，查找有没有 <code>package.json</code> 这个文件</li>
<li>在 <code>package.json</code> 文件中，查找有没有 <code>main</code> 属性</li>
<li>如果有 <code>main</code> 属性，并且 <code>main</code> 属性指向的路径存在，那么就尝试加载这个路径指定的文件！</li>
<li>如果 <code>package.json</code> 文件中，没有 <code>main</code> 属性，或者 <code>main</code> 属性指向的路径不存在，或者没有<code>package.json</code> 文件， 那么，Node尝试加载 模块根目录中 <code>index</code> 相关文件：<code>index.js</code> -&gt; <code>index.json</code> -&gt; <code>index.node</code></li>
<li>如果在<code>node_modules</code>文件夹中，找不到对应的模块文件夹，或者在项目根目录中根本没有<code>node_modules</code>文件夹，则向上一层文件夹中去查找，查找规则同上！</li>
<li>如果上一层目录中也没有查找到，则再向上翻一层去查找，直到找到当前项目所在的盘符根目录为止！</li>
<li>如果找到了盘符根目录还找不到，则报错：<code>cannot find module ***</code></li>
</ol>
</li>
</ol>
<h2 id="结合art-template模板引擎在服务器端渲染页面"><a href="#结合art-template模板引擎在服务器端渲染页面" class="headerlink" title="结合art-template模板引擎在服务器端渲染页面"></a>结合art-template模板引擎在服务器端渲染页面</h2><p><a href="https://aui.github.io/art-template/docs/" target="_blank" rel="external">art-template官方文档</a></p>
<h2 id="【了解】服务端渲染和客户端渲染的对比"><a href="#【了解】服务端渲染和客户端渲染的对比" class="headerlink" title="【了解】服务端渲染和客户端渲染的对比"></a>【了解】服务端渲染和客户端渲染的对比</h2><p><a href="https://www.cnblogs.com/" target="_blank" rel="external">博客园官网</a></p>
<ol>
<li>服务器端渲染<ul>
<li>特点：Node服务器先读取模板页面，再获取要渲染的数据，然后直接在服务器端把完整的页面渲染拼接好，然后通过网络一次性的把结果发送给浏览器去显示！【注意：通过服务器端渲染，在网络中传输的是一个真正页面】</li>
<li>优点：请求次数少，速度快，对SEO友好</li>
<li>缺点：服务器渲染压力大【在后端可以通过缓存机制去解决】</li>
</ul>
</li>
<li>客户端渲染<ul>
<li>特点：先访问服务器获取到模板页面，然后再通过Ajax获取要渲染的数据，拿到这两者之后，再客户端调用模板引擎，渲染得到模板字符串，然后通过JS的方式，把结果展示到页面上！【真正的页面是在客户端浏览器中怼出来的，在进行网络传输的时候，第一次传输的是模板页面，第二次传输的是数据】</li>
<li>优点：减轻了服务器端的渲染压力</li>
<li>缺点：请求次数多，用户体验可能没有服务器端渲染好（白屏效果）；对SEO不友好</li>
</ul>
</li>
</ol>
<h2 id="使用nodemon来自动重启Node服务"><a href="#使用nodemon来自动重启Node服务" class="headerlink" title="使用nodemon来自动重启Node服务"></a>使用<code>nodemon</code>来自动重启Node服务</h2><ol>
<li>运行<code>npm i nodemon -g</code>全局安装模块</li>
<li>使用方式 和 <code>node</code> 完全一样：<ul>
<li><code>node 要执行文件的路径</code></li>
<li><code>nodemon 要执行文件的路径</code></li>
</ul>
</li>
</ol>
<h2 id="文件列表小案例"><a href="#文件列表小案例" class="headerlink" title="文件列表小案例"></a>文件列表小案例</h2><h2 id="获取文件的属性"><a href="#获取文件的属性" class="headerlink" title="获取文件的属性"></a>获取文件的属性</h2><h2 id="【重点】在优化前-先封装一个根据指定路径读取文件内容的方法"><a href="#【重点】在优化前-先封装一个根据指定路径读取文件内容的方法" class="headerlink" title="【重点】在优化前, 先封装一个根据指定路径读取文件内容的方法"></a>【重点】在优化前, 先封装一个<code>根据指定路径读取文件内容</code>的方法</h2><h2 id="【重点】将读取文件夹的方法抽离出来，同时对error进行处理"><a href="#【重点】将读取文件夹的方法抽离出来，同时对error进行处理" class="headerlink" title="【重点】将读取文件夹的方法抽离出来，同时对error进行处理"></a>【重点】将读取文件夹的方法抽离出来，同时对error进行处理</h2><h2 id="相关文章"><a href="#相关文章" class="headerlink" title="相关文章"></a>相关文章</h2><ol>
<li><a href="https://aui.github.io/art-template/" target="_blank" rel="external">art-template 官方文档</a></li>
<li><a href="http://www.infoq.com/cn/articles/es6-in-depth-template-string" target="_blank" rel="external">ES6 - 模板字符串</a></li>
<li><a href="http://www.cnblogs.com/xljzlw/p/3694861.html" target="_blank" rel="external">js中的数组对象排序</a></li>
<li><a href="https://github.com/i5ting/tocmd.npm" target="_blank" rel="external">i5ting/tocmd.npm 将MD转换为HTML</a></li>
<li><a href="https://www.zhihu.com/question/20298345" target="_blank" rel="external">JavaScript 语句后应该加分号么？</a></li>
</ol>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/2017/10/25/node2/" data-id="cj970btp20000r852a58h7m5o" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
  
    <a href="/2017/10/25/node-express/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">express</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    

  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/10/">October 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/08/">August 2017</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2017/10/25/node2/">nodejs1</a>
          </li>
        
          <li>
            <a href="/2017/10/25/node-express/">express</a>
          </li>
        
          <li>
            <a href="/2017/10/25/node/">nodejs</a>
          </li>
        
          <li>
            <a href="/2017/10/25/nodelast/">angular2</a>
          </li>
        
          <li>
            <a href="/2017/10/22/text/">(no title)</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2017 John Doe<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/script.js"></script>

  </div>
</body>
</html>